home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Camelot / Camelot 017 (1988-06)(Swedish User Group of Amiga)(SE)(PD)[m doscopy][WB].zip / Camelot 017 (1988-06)(Swedish User Group of Amiga)(SE)(PD)[m doscopy][WB].adf / DMouse / dmouse.c < prev    next >
C/C++ Source or Header  |  1988-05-22  |  6KB  |  218 lines

  1.  
  2. /*
  3.  *  DMOUSE.C    V1.06    18 May 1988     (Aztec Compile, +L  ... 32 bit ints)
  4.  *                     and link w/ c32.lib
  5.  *
  6.  *  DMOUSE QUIT
  7.  *  DMOUSE -a# -t# -s# -m# -c# -L0 -Rqqqq -A0 -Kcccc -Qqqqq -C cmd
  8.  *
  9.  *  -a#     # = acceleration, default 3.    1 to disable
  10.  *  -t#     # = mouse threshold before acceleration takes effect, def. 0
  11.  *        (in pixels/event)
  12.  *  -s#     # = screen timeout, default 5min,    0 to disable
  13.  *  -m#     # = pointer timeout, default 5 secs,0 to disable
  14.  *  -c#     # = # of clicks to bring window to front
  15.  *  -L0     Disable LeftMouseButton->WindowToFront (LMB+RMB->ToBack)
  16.  *  -L1     Enable it
  17.  *  -Rqqqq  Set qualifier + RMB for Window/ScreenToBack (default LMB)
  18.  *  -A0     Disable Auto-Activate window on mouse move
  19.  *  -A1     Enable it
  20.  *  -Kcccc  Set key code in hex that activates cmd, def is escape
  21.  *  -Qqqqq  Set key qualifier in hex for keycode, def is left-amiga
  22.  *  -C cmd  Set command (must be last option on command line), def NewCli
  23.  *
  24.  *    Note:    The -Q Qualifiers usually must be or'd with x8000
  25.  *    Note:    The -R Qualifier should NOT be or'd with x8000.
  26.  *
  27.  *
  28.  *  To remove, BREAK the CLI it ran under.
  29.  *
  30.  *  TODO:   mouse pointer sometimes gets turned on by intuition
  31.  */
  32.  
  33. #include <stdio.h>
  34. #include "dmouse.h"
  35.  
  36. #define VERSION 6
  37.  
  38. int    Enable_Abort;        /*    CLI break enable    */
  39.  
  40. main(ac, av)
  41. char *av[];
  42. {
  43.     register short i, j, len;
  44.     register long val;
  45.     register char *ptr;
  46.     register DMS  *dms = FindPort(PORTNAME);
  47.     short   exists = (dms != NULL);
  48.     short   create = (dms == NULL);
  49.     short   quit = 0;
  50.  
  51.     Enable_Abort = 0;
  52.     if (create) {
  53.     dms = AllocMem(sizeof(DMS), MEMF_PUBLIC|MEMF_CLEAR);
  54.     dms->Version = VERSION;
  55.     dms->Acc = 3;
  56.     dms->STo = 5*60;
  57.     dms->MTo = 5;
  58.     dms->Code = 0x45;
  59.     dms->Qual = 0x8040;
  60.     dms->RQual= 0x4000;
  61.     dms->Clicks = 1;
  62.     dms->CLeft = dms->Clicks;
  63.     strcpy(dms->Cmd, "newcli");
  64.     dms->LMBEnable = 1;
  65.     dms->AAEnable = 1;
  66.     dms->NoSprData = AllocMem(12, MEMF_PUBLIC|MEMF_CHIP|MEMF_CLEAR);
  67.     dms->NoSprData[0] = 0xFE00;
  68.     dms->NoSprData[1] = 0xFF00;
  69.     }
  70.  
  71.     for (i = 1; i < ac; ++i) {
  72.     ptr = av[i];
  73.     if (strcmp(ptr, "QUIT") == 0 || strcmp(ptr, "quit") == 0) {
  74.         quit = 1;
  75.         create = 0;
  76.         break;
  77.     }
  78.     val = atoi(ptr+2);
  79.     if (*ptr == '-') {
  80.         switch(ptr[1]) {
  81.         case 'a':
  82.         dms->Acc = val;
  83.         break;
  84.         case 'c':
  85.         if (val < 1)
  86.             val = 1;
  87.         dms->Clicks = dms->CLeft = val;
  88.         break;
  89.         case 't':
  90.         dms->AThresh = val;
  91.         break;
  92.         case 's':
  93.         dms->STo = val;
  94.         break;
  95.         case 'm':
  96.         dms->MTo = val;
  97.         break;
  98.         case 'L':
  99.         dms->LMBEnable = val;
  100.         break;
  101.         case 'R':
  102.         dms->RQual = ahtoi(ptr+2);
  103.         break;
  104.         case 'A':
  105.         dms->AAEnable = val;
  106.         break;
  107.         case 'K':
  108.         dms->Code = ahtoi(ptr+2);
  109.         break;
  110.         case 'Q':
  111.         dms->Qual = ahtoi(ptr+2);
  112.         break;
  113.         case 'C':
  114.         for (len = strlen(ptr+2) + 2, j = i + 1; j < ac; ++j)
  115.             len += strlen(av[j]) + 1;
  116.         strcpy(dms->Cmd, ptr + 2);
  117.         for (j = i + 1; j < ac; ++j) {
  118.             if (dms->Cmd[0])
  119.             strcat(dms->Cmd, " ");
  120.             strcat(dms->Cmd, av[j]);
  121.         }
  122.         break;
  123.         default:
  124.         puts("DMOUSE QUIT  or");
  125.         puts("DMOUSE -a# -t# -s# -m# -L0 -Rqqqq -A0 -Kcccc -Qqqqq -C cmd");
  126.         printf("V1.%02d PUBLIC DOMAIN, Matthew Dillon, 14 May 1988\n\n", VERSION);
  127.         puts("  -a#     Acceleration (default 3)");
  128.         puts("  -t#     Accel. threshold (default 0)");
  129.         puts("  -s#     Screen timeout (default 300)");
  130.         puts("  -m#     Mouse timeout (default 5)");
  131.         puts("  -c#     Set # of clicks for wintofront (default 1)");
  132.         puts("  -L0/1   LMB disable/enable (default 1=enabled)");
  133.         puts("  -Rqqqq  RMB qualifier wintoback (default 4000=LMB)");
  134.         puts("  -A0/1   Auto-Activate Window disable/enable");
  135.         puts("  -Kcccc  Command Key Code, default 45 = esc");
  136.         puts("  -Qqqqq  Command Key Qualifier (must | with 8000)");
  137.         puts("  -C cmd  cmd to run, must be last option");
  138.         puts("Note: LMB(or -R qualifier)(hold)+RMB = WindowToBack");
  139.         puts("\n");
  140.         puts("Additionaly, Any option may be modified while DMOUSE is active");
  141.         create = 0;
  142.         break;
  143.         }
  144.     }
  145.     }
  146.     if (!exists && create) {
  147.     PROC *proc;
  148.     printf("Installing DMouse, ");
  149.     fflush(stdout);
  150.     dms->Port.mp_Flags = PA_IGNORE;
  151.     dms->Port.mp_Node.ln_Pri = 0;
  152.     dms->Port.mp_Node.ln_Type= NT_MSGPORT;
  153.     dms->Port.mp_Node.ln_Name= AllocMem(sizeof(PORTNAME), MEMF_PUBLIC);
  154.     strcpy(dms->Port.mp_Node.ln_Name, PORTNAME);
  155.     NewList(&dms->Port.mp_MsgList);
  156.     dms->Segment = LoadSeg("l:DMouse-Handler");
  157.     if (!dms->Segment)
  158.         dms->Segment = LoadSeg("DMouse-Handler");
  159.     if (!dms->Segment) {
  160.         puts("Unable to find L:DMouse-Handler");
  161.         FreeMem(dms->Port.mp_Node.ln_Name, sizeof(PORTNAME));
  162.         create = 0;
  163.     } else {
  164.         AddPort(&dms->Port);
  165.         dms->ShakeTask = FindTask(NULL);
  166.         dms->ShakeSig = AllocSignal(-1);
  167.         proc = CreateProc(dms->Port.mp_Node.ln_Name, 1, dms->Segment, 4096);
  168.         Wait(1 << dms->ShakeSig);
  169.         FreeSignal(dms->ShakeSig);
  170.         exists = 1;
  171.         quit = dms->StartupError;
  172.         if (quit)
  173.         puts("Handler error");
  174.         else
  175.         printf("ok.  DMouse V1.%02d, by Matthew Dillon.  PUBLIC DOMAIN.\n", VERSION);
  176.     }
  177.     }
  178.     if (quit) {
  179.     if (exists) {
  180.         printf("Removing, ");
  181.         fflush(stdout);
  182.         dms->ShakeTask = FindTask(NULL);
  183.         dms->ShakeSig = AllocSignal(-1);
  184.         Signal(dms->HandTask, SBF_C);
  185.         Wait(1 << dms->ShakeSig);
  186.         FreeSignal(dms->ShakeSig);
  187.         RemPort(&dms->Port);
  188.         FreeMem(dms->Port.mp_Node.ln_Name, sizeof(PORTNAME));
  189.         UnLoadSeg(dms->Segment);
  190.         puts("ok");
  191.     }
  192.     exists = 0;
  193.     create = 0;
  194.     }
  195.     if (!exists) {
  196.     FreeMem(dms->NoSprData, 12);
  197.     FreeMem(dms, sizeof(DMS));
  198.     }
  199. }
  200.  
  201. ahtoi(str)
  202. register char *str;
  203. {
  204.     register long val = 0;
  205.     register char c;
  206.     while (c = *str) {
  207.     val <<= 4;
  208.     if (c >= '0' && c <= '9')
  209.         val |= (c & 15);
  210.     else
  211.         val |= (c & 15) + 9;
  212.     ++str;
  213.     }
  214.     return(val);
  215. }
  216.  
  217.  
  218.